#include <jni.h>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include "android/log.h"

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,__VA_ARGS__ ,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,__VA_ARGS__ ,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,__VA_ARGS__ ,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,__VA_ARGS__ ,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,__VA_ARGS__ ,__VA_ARGS__) // 定义LOGF类型
JavaVM* javaVm;
jobject globalRunnable;

//会在加载so库的时候自动执行这个方法
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *pVM, void *pVoid){
    javaVm = pVM;
    JNIEnv *env = NULL;
    jint result = -1;
    if (javaVm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
        return result;
    }
    result = JNI_VERSION_1_4;
    return result;
}

void* thread_method(void* arg){
    JNIEnv* jniEnv;
    //获取一个当前线程的JNIEnv
    if(javaVm->AttachCurrentThread(&jniEnv,NULL) == JNI_OK){
        jclass jRunnableClazz = jniEnv->GetObjectClass(globalRunnable);
        jmethodID jRunMethodId = jniEnv->GetMethodID(jRunnableClazz,"run","()V");
        jniEnv->CallVoidMethod(globalRunnable,jRunMethodId);
        //用完后需销毁之前设置的那个全局变量
        jniEnv->DeleteGlobalRef(globalRunnable);
        //分离当前线程的JNIEnv
        javaVm->DetachCurrentThread();
    }
    return NULL;
}
extern "C" JNIEXPORT void JNICALL
Java_com_itfitness_threaddemo_MainActivity_startThread(
        JNIEnv* env,
        jobject mainActivity,
        jobject runnable) {
    //在其他线程中当前函数的局部变量也不能用需要设置为全局变量
    globalRunnable = env->NewGlobalRef(runnable);

    pthread_t pid;
    pthread_create(&pid,NULL,thread_method,(void *)0);
}